Помогни ни да направим Uroci.net по - богат! Добави урок

C++ част.8 (Обектно-ориентирано)

C++ » C++
fix3d   трудност:    видян: 31961



При компилация и изпълнение се получава следното:

A Program to Illustrate Virtual Functions
ZooAnimal name: Giant Panda
scientific name: Ailuropoda Melaoleuca
we call our friend: Yin YangZoo
Area Location:NorthWest: B1.P:
area BrownSpotsRoom Location: 1001
ZooAnimal name: Red Panda
scientific name: Ailurus fulgens
we call our friend: RockyZoo
Area Location:NorthWest: B1.P:
area BrownSpotsRoom Location: 943
ZooAnimal name: cartoon Bear
scientific name: ursus cartoons
Zoo Area Location:NorthWest: B1:
area Brown
ZooAnimal name: circusZooAnimal

С изключение на makeList(), програмата не взема под внимание детайлите по реализацията на обектите, членовете функции или йерархията на онаследяването. Макар и пределно прост, примерът показва нещо съществено за обектно ориентираното програмиране.

Упражнение 8-8. Реализирайте не член функцията draw(), която има аргумент от тип Shape*. Тя трябва да чертае окръжност, правоъгълен триъгълник и правоъгълник.

Упражнение 8-9. Реализирайте не член функцията reSize(), която има аргумент от тип Shape& (ще бъде нужен също аргумент за размер). Приложете последователно draw(), reSize() и след това draw() за окръжност, равностранен триъгълник и квадрат.

Упражнение 8-10. Прибавете виртуален образец на draw(), която пише в обект от клас Screen.

Упражнение 8-11. Реализирайте виртуалната функция save(), която записва обект от йерархията Shape на ostream и restore(), която чете изхода от save().



8.3 Виртуални базови класове

Макар че един базов клас може легално да се появи само веднъж в един списък с извличания, той може да се появи много пъти в рамките на йерархията на извличането. Това може да стане причина за двузначност на членовете.

Например, има дебати, и то разгорещени, в средите на зоолозите, продължаващи повече от сто години, относно това дали Panda принадлежи на фамилията Raccoon или на фамилията Bear. От компютърна гледна точка, най-доброто решение е Panda да се извлича и от двете фамилии.

class Panda: public Bear, public Raccoon {... }

Panda онаследява базовия клас ZooAnimal едновременно от Bear и от Raccoon; в Panda има две части за базовия клас. Декларирането на обект от класа Panda води до извличането на два конструктора на ZooAnimal; в следния ред:

ZooAnimal(); // base class of Bear
Bear(); // first Panda base
class ZooAnimal(); // base class of Raccoon
Raccoon(); // second Panda base
class Panda(); // derived class constructor is always last

За да можем да обсъдим този въпрос, нека да направим опростена дефиниция на ZooAnimal:

class ZooAnimal
{ // simplified definition
public:
void locate();
protected:
short zooArea;
};

class Bear : public ZooAnimal { /* ... */ }
class Raccoon : public ZooAnimal { /* ... */ }

Panda съдържа две множества от членове данни на ZooAnimal: един член данни zooArea, наследен чрез Raccoon, и един, наследен чрез Bear. Фигура 8.1 показва това:

Многократно онаследяване на базови класове

Има ненужна двузначност. Потребителят трябва да познава детайлите от многократното извличане, за да може да направи еднозначно обръщение. Освен това, се разхищава памет заради пространството, в което се съхранява образецът на допълнителния базов клас.

Panda се нуждае само от един образец на базовия клас ZooAnimal. Концептуално, Panda може да се разглежда като един насочен граф без цикли със споделен образец на базовия клас ZooAnimal. По подразбиране, обаче, механизмът за онаследяване дефинира дървовидна йерархия на извличането, в която всяка поява на базов клас поражда образец на базов клас. (виж Фигура 8.2 )

Необходимо е да се намери начин подразбиращият се механизъм на онаследяването да се пренебрегва. Трябва да бъде възможно да се определи споделен базов клас в йерархията на извличането (тоест, да може да се дефинира структурата насочен граф без цикли). В противен случай част от потребителите (възможно е твърде малка) ще бъде затруднена при използването на многократното онаследяване. Методът за пренебрегване на подразбиращия се механизъм на онаследяването, наречен “Виртуални базови класове”, дава възможност на проектантът на класовете да дефинира споделен базов клас. Независимо от това колко често даден виртуален базов клас се среща в йерархията на извличането, генерира се само един негов образец.

Например, Panda ще съдържа само един образец на споделения базов клас ZooAniaml. Достъпът до членовете на класа вече не е двузначен.


Страници: «2 3 4 5 6 7 »

Сподели урока:



Регистрирайте се, за да добавите коментар


Калдейта Ком ЕООД - © 2003-. Всички права запазени.
Препоръчваме: IT Новини